#ifndef __CMDPARSER__
#define __CMDPARSER__
#include "../_public.h"
#include "../common_types.h"
#include "header.h"


/* 该头文件用于实现对各种命令的解析  */

// 信息类型
typedef enum message_type_s
{
    COMMAND,
    LOGIN_USER,
    LOGIN_PWD
} msgType_t;

// note: 现该数据类型已弃用，后续可能删除
// 服务器->客户端响应数据格式
typedef struct serv2client_message_s
{
    msgType_t messagetype; // 信息类型，现在不确定是否使用，预留后续使用
    bool exec_status;      // 命令执行状态，true: 成功 false: 失败
    char *description;     // 信息具体描述
    fileinfos_t *filedirs; // ls返回的文件、目录信息
    char *cwd;             // 客户端当前路径
} serv2clientMsg_t;


// 获取命令，即如果输入mkdir cpp，拿到mkdir
/*
 *description:
 *       将标准输入中的命令字符串
 *       需要配合freeTokens函数使用，以释放tokens的堆空间
 *usage:
 *       int size;
 *       char *command = "cd /home/usr/zs"
 *       char **tokens = spilitcFunc("cd /usr/local", &size);
 *       // tokens = {"cd", "usr", "local"};
 *       freeTokens(&tokens, size);
 *paras:
 *       commmand       标准输入中读取的原始输入命令字符串
 *       cmdType        命令类型
 *returns:
 *      分割后的token列表
 *
 *修订记录：
 *********************************************************
 *修订1
 *      函数声明由：int getCommand(char *command, char *cmd);
 *      变更为：CMD_TYPE getCommandType(const char *command, char *cmdType);
 *
 *      修订时间：2024.07.07
 *      修订人：曾爽
 *      修订原因：
 *          1.返回值未使用且没有明确含义；
 *          2.command, cmd表意不够清晰、明确;
 *
 *********************************************************
 */
CMD_TYPE getCommandType(const char *command, char *cmdType);

// ls命令模拟实现
/*
 *description:
 *       列出当前目录：curPath下, 相对或绝对路径: path下所有文件与子目录信息并封装返回
 *usage:
 *       xxx
 *paras:
 *       splictDataCarrier_st *splictDataCarrier
 *       curPath     当前用户在服务器所处的的真实存在的物理路径，如：/home/works/zs/src
 *                   其中zs为登录的用户名
 *
 *       path        ls命令中指定的路径参数如: cprojects/homework, pics, .
 *returns:
 *       serv2clientMsg_t类型的返回值信息
 * 
 *修订记录：
 *********************************************************
 *修订1
 *      函数声明由：lsReturn_t lsCmdSimulation(const char *curPath, const char *path); // 爽
 *      变更为：lsReturn_t lsCmdSimulation(splictDataCarrier_st *splictDataCarrier)
 *
 *      修订时间：2024.07.09
 *      修订人：曾爽
 *      修订原因：
 *          1.需要调用唐凯提供的getServerAbsPath函数获取参数
 *
 *********************************************************
 */
// lsReturn_t lsCmdSimulation(const char *curPath, const char *path); // 爽
lsReturn_t lsCmdSimulation(splictDataCarrier_st *splictDataCarrier); // 爽


// ls命令模拟实现
/*
 *description:
 *       ls命令处理函数，
 *       调用lsCmdSimulation获取文件、子目录信息并将该信息发送给客户端
 *usage:
 *       xxx
 *paras:
 *       splictDataCarrier     客户端传送给服务端命令以及其它控制信息由服务器维护 
 *returns:
 *       无
 */
void lsCmdHandle(splictDataCarrier_st *splictDataCarrier); // 爽

// puts命令处理,上传文件
 void putsFunc(char **tokens, char *absPath,char *cur,int net_fd,int len); // 旭

// gets命令处理,下载文件
void sHandleGets(splictDataCarrier_st *splictDataCarrier); // 飞

// remove命令处理
int removeFunc(splictDataCarrier_st *splictDataCarrier); // 飞

// pwd命令处理
serv2clientMsg_t pwdFunc(char **tokens); // 勇

// mkdir命令处理
void mkdirFunc(char **tokens, char *cur, int net_fd, int len); // 旭

// 无效命令响应
serv2clientMsg_t invalidFunc(char **tokens); // 飞

/*
 * 单元测试函数声明，测试完成后需要删除
 * 创建人：曾爽
 * 创建事件：2024/07/06
 * */
void cdFunc(splictDataCarrier_st *splictDataCarrier, char **tokens, char *cur, char *clientCur, int net_fd, int len);
void unitest_lsCmdSimulation(splictDataCarrier_st *splictDataCarrier);
void sHandleGets(splictDataCarrier_st *splictDataCarrier);
#endif
